package com.bejoy.coolatin.util;

import java.util.HashMap;
import java.util.Map;

import com.bejoy.coolatin.volley.ImageCacheManager;

import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.widget.ImageView;


public class AsyncImageLoader extends AsyncTask<String, Void, Map<String,Object>> {

	private ImageView image;
	private ImageCacheManager lruCache; // 图片缓存技术的核心类，用于缓存所有下载好的图片，在程序内存达到设定值时会将最少最近使用的图片移除掉。
	private ObtainInterfaceUtil util;
	private boolean circle;

	/**
	 * 构造方法，需要把ImageView控件和LruCache 对象传进来
	 * 
	 * @param image
	 *            加载图片到此 {@code}ImageView
	 * @param lruCache
	 *            缓存图片的对象
	 */
	public AsyncImageLoader(ImageView image, ImageCacheManager lruCache,
			boolean circle) {
		super();
		this.image = image;
		this.lruCache = lruCache;
		this.util = new ObtainInterfaceUtil();
		this.circle = circle;
	}

	//加载图片
	@Override
	protected Map<String,Object> doInBackground(String... params) {
		Bitmap bitmap = null, resultBitmap = null;
		Map<String,Object> map=new HashMap<String,Object>();
		bitmap = util.getBitmap(params[0]);
		if (circle&&bitmap!=null) {
			resultBitmap = util.createCircleImage(bitmap);
			addBitmapToMemoryCache(params[0], resultBitmap);
			map.put("bitmap", resultBitmap);
			// 回收原图
			if (bitmap != null && !bitmap.isRecycled()) {
				bitmap.recycle();
				bitmap = null;
			}
			System.gc();
		} else {
			addBitmapToMemoryCache(params[0], bitmap);
			map.put("bitmap", bitmap);
		}
//		map.put("bitmap", bitmap);
		map.put("url", params[0]);
		return map;
	}

	@Override
	protected void onPostExecute(Map<String,Object> map) {
		if (map.get("bitmap") != null&&map.get("url").equals(image.getTag())) {
			image.setImageBitmap((Bitmap)map.get("bitmap"));
		}
	}

	// 调用LruCache的put 方法将图片加入内存缓存中，要给这个图片一个key 方便下次从缓存中取出来
	private void addBitmapToMemoryCache(String key, Bitmap bitmap) {
		if (key != null && bitmap != null
				&& getBitmapFromMemoryCache(key) == null) {
			lruCache.putBitmap(key, bitmap);
		}
	}

	// 调用Lrucache的get 方法从内存缓存中去图片
	public Bitmap getBitmapFromMemoryCache(String key) {
		return lruCache.getBitmap(key);
	}

}
